﻿/**
 * @file singleton_op.hpp
 * @date 2021/04/25 14:11
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief 单例模块类操作
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/04/25 14:11         <td>1.0.0       <td>harrybao
 * <td>创建初始版本
 * </table>
 */

// #ifndef singleton_op_HPP
// #define singleton_op_HPP

#pragma once

#include <ctime>

#include "singleton.hpp"


namespace guild_service {
namespace common {
/**
 * @brief 模板销毁
 *
 * @tparam T 模板类模板
 */
template <typename T>
inline static void singleton_destroy() {
  singleton<T>::destroy();
}

/**
 * @brief 模块运行
 *
 * @tparam T 模块类
 * @tparam Args 运行参数类模板
 * @param args 运行参数
 * @return true 运行成功
 * @return false 运行失败
 */
template <typename T, typename... Args>
inline static bool singleton_start(Args&&... args) {
  return (*common::singleton<T>::instance(std::forward<Args>(args)...)).start();
}

/**
 * @brief 模块停止
 *
 * @tparam T 模块类模板
 * @return true 停止成功
 * @return false 停止失败
 */
template <typename T>
inline static bool singleton_stop() {
  if (!(*common::singleton<T>::instance()).stop()) {
    return false;
  }

  if (!(*common::singleton<T>::instance()).started()) {
    singleton_destroy<T>();
  }

  return true;
}

/**
 * @brief 模块更新
 *
 * @tparam T 模块类模板
 * @param ms 当前时间戳
 * @return true 更新成功
 * @return false 更新失败
 */
template <typename T>
inline static bool singleton_update(time_t ms) {
  if (!(*common::singleton<T>::instance()).started()) {
    return false;
  }

  (*common::singleton<T>::instance()).update(ms);

  return true;
}

}  // namespace common
}  // namespace guild_service

// #endif  // MODULE_HPP